/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package server.data;

import server.data.Queue;
import server.data.Knoop;
import java.util.*;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import data.Letter;
import server.dataaccess.LetterDAO;

;

/**
 *
 * @author Liesbeth
 */
public class BlokjesVerdeler {

    //private ArrayList<String> moAlfabet;
    private static Hashtable<String, Integer> moLetterwaardes = new Hashtable<String, Integer>();
    //private final static BlokjesVerdeler instance = new BlokjesVerdeler();
    private int miAantalBlokjes = 0;
    private Queue queue;
    private Logger logger = Logger.getLogger(BlokjesVerdeler.class);

    public BlokjesVerdeler() {
        ArrayList<Knoop> letters = getAlleLetters();
        Knoop[] knopen = new Knoop[getAantalBlokjes()];
        letters.toArray(knopen);
        queue = new Queue(knopen.length, knopen);
        queue.schrijf();
    }

    private ArrayList<Knoop> getAlleLetters() {
        ArrayList<Letter> letters = LetterDAO.getAlleLetters();
        ArrayList<Knoop> arrLetters = new ArrayList<Knoop>();

        for (Letter l : letters) {
            moLetterwaardes.put(String.valueOf(l.getLetter()), l.getPuntenWaarde());
            for (int i = 0; i < l.getAantalKeerInSpel(); i++) {
                Knoop k = new Knoop((int) (Math.random() * 100), String.valueOf(l.getLetter()));
                arrLetters.add(k);
                miAantalBlokjes++;
            }
        }

        return arrLetters;
    }
    //returns 0 wanneer er geen blokjes meer beschikbaar zijn
    private String geefBlokje() {
        if (getAantalBlokjes() > 0) {
            int i = (int) ((getAantalBlokjes() - 1) * Math.random()) + 1;
            setAantalBlokjes(getAantalBlokjes() - 1);
            String s = queue.geefwortel().getLetter();
            queue.verwijderwortel();
            logger.info("blokje verwijderd uit het zakje");
            queue.schrijf();
            return s;
        } else {
            return null;
        }
    }

    public ArrayList<String> geefblokjes(int aantal) {
        ArrayList<String> arrBlokjes = new ArrayList<String>();
        for (int i = 0; i < aantal; i++) {
            String letter = geefBlokje();
            if(letter!=null){
                arrBlokjes.add(letter);
            }
        }
        logger.info("Na weghalen van " + aantal + " letters uit het zakje, bevat het zakje nog " + getAantalBlokjes() + " letters.");
        return arrBlokjes;

    }

    //moet private gezet worden
    public void steekBlokjeTerugInZakje(String s) {
        Knoop k = new Knoop((int) (Math.random() * 100), s);
        queue.voegToe(k);
        setAantalBlokjes(getAantalBlokjes() + 1);
    }

    public void steekBlokjesTerugInZakje(ArrayList<String> s) {
        for (int i = 0; i < s.size(); i++) {
            steekBlokjeTerugInZakje(s.get(i));
        }

        logger.info("Na terugsteken van " + s.size() + " letters in het zakje, bevat het zakje nog " + getAantalBlokjes() + " letters.");
    }

    public int getAantalBlokjes() {
        return miAantalBlokjes;
    }

    private void setAantalBlokjes(int iAantalBlokjes) {
        this.miAantalBlokjes = iAantalBlokjes;
    }

    public int getLetterWaarde(String letter) {
        return moLetterwaardes.get(letter);
    }

    public Hashtable<String, Integer> aanvraagLetterWaarde() {
        Hashtable<String, Integer> tab = new Hashtable<String, Integer>();
        String s = "A";
        for (int i = 0; i < 26; i++) {
            tab.put(s + i, getLetterWaarde(s + i));
        }
        tab.put(" ", getLetterWaarde(" "));
        return tab;
    }

    public static void main(String[] args) {
        Hashtable<String, Integer> tab = new Hashtable<String, Integer>();
        char s = 'A';
        for (int i = 0; i < 26; i++) {
            String str = (String.valueOf((char) (s + i)));
            System.out.println((char) (s + i));
        //  tab.put(str, getLetterWaarde(str));
        }

    /*
    tab.put(" ", getLetterWaarde(" "));
    for(String s2: tab.keySet())
    {
    System.out.println(s2 +" : " + tab.get(s2));
    }
     * */

    }
}
